package controller;

import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import pojo.PatientDoctor;
import service.PatientDoctorService;

import java.util.List;

/**
 * 患者-医生关联信息控制器
 */
@RestController
@CrossOrigin(origins = "*")
@RequestMapping("/patientDoctor")
@Api(tags = "患者-医生关联接口", description = "提供患者与医生关联相关的增删改查功能")
public class PatientDoctorController {

    @Autowired
    private PatientDoctorService patientDoctorService;

    /**
     * 查询所有患者-医生关联数据
     * @return 关联数据列表
     */
    @GetMapping("/findAll")
    @ResponseBody
    @ApiOperation(value = "查询所有关联数据", notes = "获取系统中所有患者与医生的关联记录")
    @ApiResponses({
            @ApiResponse(code = 200, message = "查询成功，返回关联数据列表"),
            @ApiResponse(code = 500, message = "服务器内部错误，请联系管理员")
    })
    public List<PatientDoctor> findAll() {
        return patientDoctorService.findAll();
    }

    /**
     * 新增患者-医生关联数据
     * @param patientDoctor 关联信息（JSON 格式，包含患者、医生等信息）
     * @return 影响行数（1 表示成功）
     */
    @PostMapping("/add")
    @ResponseBody
    @ApiOperation(value = "新增关联数据", notes = "新增患者与医生的关联信息到系统")
    @ApiImplicitParam(name = "patientDoctor", value = "患者-医生关联对象", required = true, dataType = "PatientDoctor", paramType = "body")
    @ApiResponses({
            @ApiResponse(code = 200, message = "新增成功，返回影响行数"),
            @ApiResponse(code = 400, message = "参数错误（如必填字段为空）"),
            @ApiResponse(code = 500, message = "服务器内部错误，请联系管理员")
    })
    public int add(@RequestBody PatientDoctor patientDoctor) {
        return patientDoctorService.add(patientDoctor);
    }

    /**
     * 更新患者-医生关联数据
     * @param patientDoctor 关联信息（需包含主键 ID，JSON 格式）
     * @return 影响行数（1 表示成功）
     */
    @PostMapping("/update")
    @ResponseBody
    @ApiOperation(value = "更新关联数据", notes = "根据 ID 更新患者与医生的关联记录信息")
    @ApiImplicitParam(name = "patientDoctor", value = "患者-医生关联对象（含 ID）", required = true, dataType = "PatientDoctor", paramType = "body")
    @ApiResponses({
            @ApiResponse(code = 200, message = "修改成功，返回影响行数"),
            @ApiResponse(code = 400, message = "参数错误（如 ID 为空或无效）"),
            @ApiResponse(code = 500, message = "服务器内部错误，请联系管理员")
    })
    public int update(@RequestBody PatientDoctor patientDoctor) {
        return patientDoctorService.update(patientDoctor);
    }

    /**
     * 根据 ID 删除患者-医生关联数据
     * @param id 要删除的关联记录主键 ID
     * @return 影响行数（1 表示成功）
     */
    @PostMapping("/delete")
    @ResponseBody
    @ApiOperation(value = "删除关联数据", notes = "根据 ID 移除患者与医生的关联记录")
    @ApiImplicitParam(name = "id", value = "关联记录主键 ID", required = true, dataType = "Integer", paramType = "query")
    @ApiResponses({
            @ApiResponse(code = 200, message = "删除成功，返回影响行数"),
            @ApiResponse(code = 400, message = "ID 无效（如为空或负数）"),
            @ApiResponse(code = 500, message = "服务器内部错误，请联系管理员")
    })
    public int delete(@RequestParam Integer id) {
        return patientDoctorService.deletePatientDoctor(id);
    }

    /**
     * 根据 ID 查询患者-医生关联数据
     * @param id 关联记录主键 ID
     * @return 对应的关联数据对象
     */
    @GetMapping("/findById")
    @ResponseBody
    @ApiOperation(value = "根据 ID 查询关联数据", notes = "通过主键 ID 获取患者与医生的关联记录详情")
    @ApiImplicitParam(name = "id", value = "关联记录主键 ID", required = true, dataType = "Integer", paramType = "query")
    @ApiResponses({
            @ApiResponse(code = 200, message = "查询成功，返回关联数据对象"),
            @ApiResponse(code = 400, message = "ID 无效（如为空或负数）"),
            @ApiResponse(code = 500, message = "服务器内部错误，请联系管理员")
    })
    public PatientDoctor findById(@RequestParam Integer id) {
        return patientDoctorService.findById(id);
    }


    /**
     * 根据医生ID查询患者-医生关联数据
     * @param docId 医生ID
     * @return 该医生的所有患者关联记录列表
     */
    @GetMapping("/findByDocId")
    @ResponseBody
    @ApiOperation(value = "根据医生ID查询关联数据", notes = "通过医生ID获取该医生的所有患者关联记录")
    @ApiImplicitParam(name = "docId", value = "医生ID", required = true, dataType = "String", paramType = "query")
    @ApiResponses({
            @ApiResponse(code = 200, message = "查询成功，返回该医生的关联数据列表"),
            @ApiResponse(code = 400, message = "医生ID无效（如为空）"),
            @ApiResponse(code = 500, message = "服务器内部错误，请联系管理员")
    })
    public List<PatientDoctor> findByDocId(@RequestParam String docId) {
        return patientDoctorService.findByDocId(docId);
    }
}